package com.leyou.controller;

import com.leyou.auth.entity.UserInfo;
import com.leyou.pojo.Cart;
import com.leyou.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@Controller
public class CartController {

    @Autowired
    private CartService cartService;

    /**
     * 已登录状态下加入购物车方法
     *
     * @param cart
     * @return
     */
    @PostMapping
    public ResponseEntity<UserInfo> addCart(@RequestBody Cart cart) {
        this.cartService.addCart(cart);
        return ResponseEntity.ok().build();
    }

    /**
     * 已登录状态下查询购物车数据，请求就是/cart   没有参数
     *
     * @return
     */
    @GetMapping
    public ResponseEntity<List<Cart>> queryCartList() {
        List<Cart> carts = this.cartService.queryCartList();
        if (carts == null) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
        return ResponseEntity.ok(carts);
    }

    /**
     * 登录状态下加减商品数量的请求
     *
     * @param cart
     * @return
     */
    @PutMapping
    public ResponseEntity<Void> updateCart(@RequestBody Cart cart) {
        this.cartService.updateCart(cart);
        return ResponseEntity.noContent().build();  // 204服务器成功处理了请求，但不需要返回任何实体内容，并且希望返回更新了的元信息。响应可能通过实体头部的形式，返回新的或更新后的元信息。如果存在这些头部信息，则应当与所请求的变量相呼应。
    }

    /**
     * 登录状态下删除商品数量的请求
     *
     * @param skuId
     * @return
     */
    @DeleteMapping("{skuId}")
    public ResponseEntity<Void> deleteCart(@PathVariable("skuId") String skuId) {
        this.cartService.deleteCart(skuId);
        return ResponseEntity.ok().build();

    }

    /**
     * 登录后如果localStorage里有数据，传过来合并数据
     * 类型不对的话会报：Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
     * 之前的想法是传来过字符串的数组"[{a:1},{b:2}]" 直接封装成List,这样是不行的。后来直接传字符串使用ObjectMapper工具转换。
     * @param carts
     * @return
     */
    @PostMapping("merge")
    public ResponseEntity<List<Cart>> mergeCartList(@RequestParam("carts") String carts) {
        List<Cart> mergeCarts = this.cartService.mergeCartList(carts);
        if (CollectionUtils.isEmpty(mergeCarts)) {
            return ResponseEntity.ok(mergeCarts);
        }

        return ResponseEntity.ok(mergeCarts);
    }
}
